home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / ds3100.md / RCS / isinf.c,v < prev    next >
Text File  |  1990-09-11  |  3KB  |  147 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     90.09.11.14.46.43;  author kupfer;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     90.09.06.17.31.52;  author kupfer;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @Determine if IEEE floating point number is infinite.
  22. @
  23.  
  24.  
  25. 1.2
  26. log
  27. @Use function prototypes.
  28. @
  29. text
  30. @/* 
  31.  * isinf.c --
  32.  *
  33.  *    Machine-dependent procedure to determine whether a double is 
  34.  *    infinity.
  35.  *
  36.  * Copyright 1989 Regents of the University of California
  37.  * Permission to use, copy, modify, and distribute this
  38.  * software and its documentation for any purpose and without
  39.  * fee is hereby granted, provided that the above copyright
  40.  * notice appear in all copies.  The University of California
  41.  * makes no representations about the suitability of this
  42.  * software for any purpose.  It is provided "as is" without
  43.  * express or implied warranty.
  44.  */
  45.  
  46. #ifndef lint
  47. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/ds3100.md/RCS/isinf.c,v 1.1 90/09/06 17:31:52 kupfer Exp Locker: kupfer $ SPRITE (Berkeley)";
  48. #endif /* not lint */
  49.  
  50. #include <math.h>
  51.  
  52.  
  53. /*
  54.  *----------------------------------------------------------------------
  55.  *
  56.  * isinf --
  57.  *
  58.  *    Return whether a double is equivalent to infinity.
  59.  *
  60.  * Results:
  61.  *    1 if the number is infinity, 0 otherwise.
  62.  *
  63.  * Side effects:
  64.  *    None.
  65.  *
  66.  *----------------------------------------------------------------------
  67.  */
  68.  
  69. int
  70. isinf(value)
  71.     double value;
  72. {
  73.     union {
  74.     double d;
  75.     long l[2];
  76.     } u;
  77.  
  78.     /*
  79.      * Put the value into a union so we can check out the bits.
  80.      */
  81.     u.d = value;
  82.  
  83.  
  84.     /*
  85.      * An IEEE Std 754 double precision floating point number
  86.      * has the following format:
  87.      *
  88.      *      1  bit       -- sign of Mantissa
  89.      *      11 bits      -- exponent
  90.      *      52 bits      -- Mantissa
  91.      *
  92.      * If the exponent has all bits set, the value is not a 
  93.      * real number.
  94.      *
  95.      * If the Mantissa is zero then the value is infinity, which
  96.      * is the result of division by zero, or overflow.
  97.      *
  98.      * If the Mantissa is non-zero the value is not a number (NaN).
  99.      * NaN can be generated by dividing zero by itself, taking the
  100.      * logarithm of a negative number, etc.
  101.      */
  102.  
  103.     /*
  104.      * check the exponent
  105.      */
  106.     if ((u.l[1] & 0x7ff00000) == 0x7ff00000) {
  107.  
  108.     /*
  109.      * See if the Mantissa is zero.
  110.      */
  111.     if ((u.l[1] & ~0xfff00000) == 0 && u.l[0] == 0) {
  112.         /*
  113.          * Infinity.
  114.          */
  115.         return (1);
  116.     } else {
  117.         /*
  118.          * NaN.
  119.          */
  120.         return(0);
  121.     }
  122.     } else {
  123.     /*
  124.      * Normal.
  125.      */
  126.     return (0);
  127.     }
  128. }
  129.  
  130.  
  131. @
  132.  
  133.  
  134. 1.1
  135. log
  136. @Initial revision
  137. @
  138. text
  139. @d18 1
  140. a18 1
  141. static char rcsid[] = "$Header: /sprite/lib/forms/RCS/proto.c,v 1.2 89/01/07 04:12:18 rab Exp $ SPRITE (Berkeley)";
  142. d21 2
  143. d27 1
  144. a27 1
  145.  * isnan --
  146. @
  147.